{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 真实世界的数据集\n",
    "# 对于每一个数据集，用各种方法，从原始数据中提取有意义的内容\n",
    "\n",
    "# the case 4\n",
    "# the dataset usda_food comes form the USDA\n",
    "\n",
    "# the overview of this dataset\n",
    "\n",
    "# USDA食品数据库\n",
    "\n",
    "# 美国农业部（USDA） 制作了一份有关食物营养信息的数据库。\n",
    "#    Ashley Williams 制作了该数据的 JSON 版（http://ashleyw.co.uk/project/food-nutrient-database） 。 其中的记录如下所示："
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "{\n",
    "  \"id\": 21441,\n",
    "  \"description\": \"KENTUCKY FRIED CHICKEN, Fried Chicken, EXTRA CRISPY, Wing, meat and skin with breading\",\n",
    "  \"tags\": [\"KFC\"],\n",
    "  \"manufacturer\": \"Kentucky Fried Chicken\",\n",
    "  \"group\": \"Fast Foods\",\n",
    "  \"portions\": [\n",
    "    {\n",
    "      \"amount\": 1,\n",
    "      \"unit\": \"wing, with skin\",\n",
    "      \"grams\": 68.0\n",
    "    },\n",
    "  ...\n",
    "  ],\n",
    "  \"nutrients\": [\n",
    "  {\n",
    "    \"value\": 20.8,\n",
    "    \"units\": \"g\",\n",
    "    \"description\": \"Protein\",\n",
    "    \"group\": \"Composition\"\n",
    "  },\n",
    "  ...\n",
    "  ]\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "6636"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 每种食物都带有若干标识性属性以及两个有关营养成分和分量的列表\n",
    "\n",
    "#  这种形式的数据不是很适合分析工作， 因此需要做一些规整化以使其具有更好用的形式\n",
    "\n",
    "# 从上面列举的那个网址下载并解压数据之后， 可以用任何喜欢的 JSON 库将其加载到 Python 中\n",
    "# 用的是 Python 内置的 json 模块\n",
    "\n",
    "import json\n",
    "\n",
    "dataset_path = './../dataset/'\n",
    "\n",
    "db = json.load(open(dataset_path + 'usda_food/database.json'))\n",
    "\n",
    "len(db)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_keys(['id', 'description', 'tags', 'manufacturer', 'group', 'portions', 'nutrients'])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# db 中的每个条目都是一个含有某种食物全部数据的字典\n",
    "# nutrients 字段是一个字典列表，其中的每个字典对应一种营养成分\n",
    "\n",
    "db[0].keys()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'value': 25.18,\n",
       " 'units': 'g',\n",
       " 'description': 'Protein',\n",
       " 'group': 'Composition'}"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "db[0]['nutrients'][0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>value</th>\n",
       "      <th>units</th>\n",
       "      <th>description</th>\n",
       "      <th>group</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>25.18</td>\n",
       "      <td>g</td>\n",
       "      <td>Protein</td>\n",
       "      <td>Composition</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>29.20</td>\n",
       "      <td>g</td>\n",
       "      <td>Total lipid (fat)</td>\n",
       "      <td>Composition</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3.06</td>\n",
       "      <td>g</td>\n",
       "      <td>Carbohydrate, by difference</td>\n",
       "      <td>Composition</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3.28</td>\n",
       "      <td>g</td>\n",
       "      <td>Ash</td>\n",
       "      <td>Other</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>376.00</td>\n",
       "      <td>kcal</td>\n",
       "      <td>Energy</td>\n",
       "      <td>Energy</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>39.28</td>\n",
       "      <td>g</td>\n",
       "      <td>Water</td>\n",
       "      <td>Composition</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>1573.00</td>\n",
       "      <td>kJ</td>\n",
       "      <td>Energy</td>\n",
       "      <td>Energy</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     value units                  description        group\n",
       "0    25.18     g                      Protein  Composition\n",
       "1    29.20     g            Total lipid (fat)  Composition\n",
       "2     3.06     g  Carbohydrate, by difference  Composition\n",
       "3     3.28     g                          Ash        Other\n",
       "4   376.00  kcal                       Energy       Energy\n",
       "5    39.28     g                        Water  Composition\n",
       "6  1573.00    kJ                       Energy       Energy"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "\n",
    "nutrients = pd.DataFrame(db[0]['nutrients'])\n",
    "\n",
    "nutrients[:7]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>description</th>\n",
       "      <th>group</th>\n",
       "      <th>id</th>\n",
       "      <th>manufacturer</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Cheese, caraway</td>\n",
       "      <td>Dairy and Egg Products</td>\n",
       "      <td>1008</td>\n",
       "      <td></td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Cheese, cheddar</td>\n",
       "      <td>Dairy and Egg Products</td>\n",
       "      <td>1009</td>\n",
       "      <td></td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Cheese, edam</td>\n",
       "      <td>Dairy and Egg Products</td>\n",
       "      <td>1018</td>\n",
       "      <td></td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Cheese, feta</td>\n",
       "      <td>Dairy and Egg Products</td>\n",
       "      <td>1019</td>\n",
       "      <td></td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Cheese, mozzarella, part skim milk</td>\n",
       "      <td>Dairy and Egg Products</td>\n",
       "      <td>1028</td>\n",
       "      <td></td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                          description                   group    id  \\\n",
       "0                     Cheese, caraway  Dairy and Egg Products  1008   \n",
       "1                     Cheese, cheddar  Dairy and Egg Products  1009   \n",
       "2                        Cheese, edam  Dairy and Egg Products  1018   \n",
       "3                        Cheese, feta  Dairy and Egg Products  1019   \n",
       "4  Cheese, mozzarella, part skim milk  Dairy and Egg Products  1028   \n",
       "\n",
       "  manufacturer  \n",
       "0               \n",
       "1               \n",
       "2               \n",
       "3               \n",
       "4               "
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 在将字典列表转换为 DataFrame 时，\n",
    "#  可以抽取其中的一部分字段\n",
    "\n",
    "# 这里，将取出食物的名称，分类，编号以及制造商等信息\n",
    "info_keys = ['description', 'group', 'id', 'manufacturer']\n",
    "\n",
    "info = pd.DataFrame(db, columns=info_keys)\n",
    "\n",
    "info[:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 6636 entries, 0 to 6635\n",
      "Data columns (total 4 columns):\n",
      " #   Column        Non-Null Count  Dtype \n",
      "---  ------        --------------  ----- \n",
      " 0   description   6636 non-null   object\n",
      " 1   group         6636 non-null   object\n",
      " 2   id            6636 non-null   int64 \n",
      " 3   manufacturer  5195 non-null   object\n",
      "dtypes: int64(1), object(3)\n",
      "memory usage: 207.5+ KB\n"
     ]
    }
   ],
   "source": [
    "info.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Vegetables and Vegetable Products    812\n",
       "Beef Products                        618\n",
       "Baked Products                       496\n",
       "Breakfast Cereals                    403\n",
       "Legumes and Legume Products          365\n",
       "Fast Foods                           365\n",
       "Lamb, Veal, and Game Products        345\n",
       "Sweets                               341\n",
       "Fruits and Fruit Juices              328\n",
       "Pork Products                        328\n",
       "Name: group, dtype: int64"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 通过 value_counts ，可以查看食物类别的分布情况\n",
    "pd.value_counts(info.group)[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 现在，为了对全部营养数据做一些分析，最简单的办法是将所有食物的营养成分整合到一个大表中\n",
    "# 分几个步骤来实现该目的\n",
    "#    首先，将各个食物的营养成分列表转换为一个 DataFrame，并添加一个表示编号的列\n",
    "#    然后，将该 DataFrame 添加到一个列表中\n",
    "#    最后，通过 concat 将这些东西连接起来就OK了\n",
    "\n",
    "# 顺利的话，nutrients 的结果如下"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>value</th>\n",
       "      <th>units</th>\n",
       "      <th>description</th>\n",
       "      <th>group</th>\n",
       "      <th>id</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>25.180</td>\n",
       "      <td>g</td>\n",
       "      <td>Protein</td>\n",
       "      <td>Composition</td>\n",
       "      <td>1008</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>29.200</td>\n",
       "      <td>g</td>\n",
       "      <td>Total lipid (fat)</td>\n",
       "      <td>Composition</td>\n",
       "      <td>1008</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3.060</td>\n",
       "      <td>g</td>\n",
       "      <td>Carbohydrate, by difference</td>\n",
       "      <td>Composition</td>\n",
       "      <td>1008</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3.280</td>\n",
       "      <td>g</td>\n",
       "      <td>Ash</td>\n",
       "      <td>Other</td>\n",
       "      <td>1008</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>376.000</td>\n",
       "      <td>kcal</td>\n",
       "      <td>Energy</td>\n",
       "      <td>Energy</td>\n",
       "      <td>1008</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>389350</th>\n",
       "      <td>0.000</td>\n",
       "      <td>mcg</td>\n",
       "      <td>Vitamin B-12, added</td>\n",
       "      <td>Vitamins</td>\n",
       "      <td>43546</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>389351</th>\n",
       "      <td>0.000</td>\n",
       "      <td>mg</td>\n",
       "      <td>Cholesterol</td>\n",
       "      <td>Other</td>\n",
       "      <td>43546</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>389352</th>\n",
       "      <td>0.072</td>\n",
       "      <td>g</td>\n",
       "      <td>Fatty acids, total saturated</td>\n",
       "      <td>Other</td>\n",
       "      <td>43546</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>389353</th>\n",
       "      <td>0.028</td>\n",
       "      <td>g</td>\n",
       "      <td>Fatty acids, total monounsaturated</td>\n",
       "      <td>Other</td>\n",
       "      <td>43546</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>389354</th>\n",
       "      <td>0.041</td>\n",
       "      <td>g</td>\n",
       "      <td>Fatty acids, total polyunsaturated</td>\n",
       "      <td>Other</td>\n",
       "      <td>43546</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>389355 rows × 5 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "          value units                         description        group     id\n",
       "0        25.180     g                             Protein  Composition   1008\n",
       "1        29.200     g                   Total lipid (fat)  Composition   1008\n",
       "2         3.060     g         Carbohydrate, by difference  Composition   1008\n",
       "3         3.280     g                                 Ash        Other   1008\n",
       "4       376.000  kcal                              Energy       Energy   1008\n",
       "...         ...   ...                                 ...          ...    ...\n",
       "389350    0.000   mcg                 Vitamin B-12, added     Vitamins  43546\n",
       "389351    0.000    mg                         Cholesterol        Other  43546\n",
       "389352    0.072     g        Fatty acids, total saturated        Other  43546\n",
       "389353    0.028     g  Fatty acids, total monounsaturated        Other  43546\n",
       "389354    0.041     g  Fatty acids, total polyunsaturated        Other  43546\n",
       "\n",
       "[389355 rows x 5 columns]"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nutrients = []\n",
    "\n",
    "for rec in db:\n",
    "    fnuts = pd.DataFrame(rec['nutrients'])\n",
    "    fnuts['id'] = rec['id']\n",
    "    nutrients.append(fnuts)\n",
    "\n",
    "nutrients = pd.concat(nutrients, ignore_index=True)\n",
    "\n",
    "nutrients"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "14179"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 发现这个 DataFrame 中无论如何都会有一些重复项，所以直接丢弃就可以\n",
    "nutrients.duplicated().sum()  # number of duplicates"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 6636 entries, 0 to 6635\n",
      "Data columns (total 4 columns):\n",
      " #   Column        Non-Null Count  Dtype \n",
      "---  ------        --------------  ----- \n",
      " 0   food          6636 non-null   object\n",
      " 1   fgroup        6636 non-null   object\n",
      " 2   id            6636 non-null   int64 \n",
      " 3   manufacturer  5195 non-null   object\n",
      "dtypes: int64(1), object(3)\n",
      "memory usage: 207.5+ KB\n"
     ]
    }
   ],
   "source": [
    "nutrients = nutrients.drop_duplicates()\n",
    "\n",
    "# 由于两个 DataFrame 对象中都有 group 和 description ，\n",
    "# 所以为了明确到底谁是谁，需要对它们进行重命名\n",
    "\n",
    "col_mapping = {'description' : 'food', 'group' : 'fgroup'}\n",
    "\n",
    "info = info.rename(columns=col_mapping, copy=False)\n",
    "\n",
    "info.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>value</th>\n",
       "      <th>units</th>\n",
       "      <th>nutrient</th>\n",
       "      <th>nutgroup</th>\n",
       "      <th>id</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>25.180</td>\n",
       "      <td>g</td>\n",
       "      <td>Protein</td>\n",
       "      <td>Composition</td>\n",
       "      <td>1008</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>29.200</td>\n",
       "      <td>g</td>\n",
       "      <td>Total lipid (fat)</td>\n",
       "      <td>Composition</td>\n",
       "      <td>1008</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3.060</td>\n",
       "      <td>g</td>\n",
       "      <td>Carbohydrate, by difference</td>\n",
       "      <td>Composition</td>\n",
       "      <td>1008</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3.280</td>\n",
       "      <td>g</td>\n",
       "      <td>Ash</td>\n",
       "      <td>Other</td>\n",
       "      <td>1008</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>376.000</td>\n",
       "      <td>kcal</td>\n",
       "      <td>Energy</td>\n",
       "      <td>Energy</td>\n",
       "      <td>1008</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>389350</th>\n",
       "      <td>0.000</td>\n",
       "      <td>mcg</td>\n",
       "      <td>Vitamin B-12, added</td>\n",
       "      <td>Vitamins</td>\n",
       "      <td>43546</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>389351</th>\n",
       "      <td>0.000</td>\n",
       "      <td>mg</td>\n",
       "      <td>Cholesterol</td>\n",
       "      <td>Other</td>\n",
       "      <td>43546</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>389352</th>\n",
       "      <td>0.072</td>\n",
       "      <td>g</td>\n",
       "      <td>Fatty acids, total saturated</td>\n",
       "      <td>Other</td>\n",
       "      <td>43546</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>389353</th>\n",
       "      <td>0.028</td>\n",
       "      <td>g</td>\n",
       "      <td>Fatty acids, total monounsaturated</td>\n",
       "      <td>Other</td>\n",
       "      <td>43546</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>389354</th>\n",
       "      <td>0.041</td>\n",
       "      <td>g</td>\n",
       "      <td>Fatty acids, total polyunsaturated</td>\n",
       "      <td>Other</td>\n",
       "      <td>43546</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>375176 rows × 5 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "          value units                            nutrient     nutgroup     id\n",
       "0        25.180     g                             Protein  Composition   1008\n",
       "1        29.200     g                   Total lipid (fat)  Composition   1008\n",
       "2         3.060     g         Carbohydrate, by difference  Composition   1008\n",
       "3         3.280     g                                 Ash        Other   1008\n",
       "4       376.000  kcal                              Energy       Energy   1008\n",
       "...         ...   ...                                 ...          ...    ...\n",
       "389350    0.000   mcg                 Vitamin B-12, added     Vitamins  43546\n",
       "389351    0.000    mg                         Cholesterol        Other  43546\n",
       "389352    0.072     g        Fatty acids, total saturated        Other  43546\n",
       "389353    0.028     g  Fatty acids, total monounsaturated        Other  43546\n",
       "389354    0.041     g  Fatty acids, total polyunsaturated        Other  43546\n",
       "\n",
       "[375176 rows x 5 columns]"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "col_mapping = {'description' : 'nutrient', 'group' : 'nutgroup'}\n",
    "\n",
    "nutrients = nutrients.rename(columns=col_mapping, copy=False)\n",
    "\n",
    "nutrients"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 375176 entries, 0 to 375175\n",
      "Data columns (total 8 columns):\n",
      " #   Column        Non-Null Count   Dtype  \n",
      "---  ------        --------------   -----  \n",
      " 0   value         375176 non-null  float64\n",
      " 1   units         375176 non-null  object \n",
      " 2   nutrient      375176 non-null  object \n",
      " 3   nutgroup      375176 non-null  object \n",
      " 4   id            375176 non-null  int64  \n",
      " 5   food          375176 non-null  object \n",
      " 6   fgroup        375176 non-null  object \n",
      " 7   manufacturer  293054 non-null  object \n",
      "dtypes: float64(1), int64(1), object(6)\n",
      "memory usage: 25.8+ MB\n"
     ]
    }
   ],
   "source": [
    "# 做完这些，就可以将 info 和 nutrients 合并起来\n",
    "ndata = pd.merge(nutrients, info, on='id', how='outer')\n",
    "\n",
    "ndata.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "value                                             0.04\n",
       "units                                                g\n",
       "nutrient                                       Glycine\n",
       "nutgroup                                   Amino Acids\n",
       "id                                                6158\n",
       "food            Soup, tomato bisque, canned, condensed\n",
       "fgroup                      Soups, Sauces, and Gravies\n",
       "manufacturer                                          \n",
       "Name: 30000, dtype: object"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ndata.iloc[30000]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x181c8b48>"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 现在可以根据食物分类和营养类型绘制一张中位值图\n",
    "result = ndata.groupby(['nutrient', 'fgroup'])['value'].quantile(0.5)\n",
    "\n",
    "result['Zinc, Zn'].sort_values().plot(kind='barh')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "nutrient\n",
       "Alanine                           Gelatins, dry powder, unsweetened\n",
       "Arginine                               Seeds, sesame flour, low-fat\n",
       "Aspartic acid                                   Soy protein isolate\n",
       "Cystine                Seeds, cottonseed flour, low fat (glandless)\n",
       "Glutamic acid                                   Soy protein isolate\n",
       "Glycine                           Gelatins, dry powder, unsweetened\n",
       "Histidine                Whale, beluga, meat, dried (Alaska Native)\n",
       "Hydroxyproline    KENTUCKY FRIED CHICKEN, Fried Chicken, ORIGINA...\n",
       "Isoleucine        Soy protein isolate, PROTEIN TECHNOLOGIES INTE...\n",
       "Leucine           Soy protein isolate, PROTEIN TECHNOLOGIES INTE...\n",
       "Lysine            Seal, bearded (Oogruk), meat, dried (Alaska Na...\n",
       "Methionine                    Fish, cod, Atlantic, dried and salted\n",
       "Phenylalanine     Soy protein isolate, PROTEIN TECHNOLOGIES INTE...\n",
       "Proline                           Gelatins, dry powder, unsweetened\n",
       "Serine            Soy protein isolate, PROTEIN TECHNOLOGIES INTE...\n",
       "Threonine         Soy protein isolate, PROTEIN TECHNOLOGIES INTE...\n",
       "Tryptophan         Sea lion, Steller, meat with fat (Alaska Native)\n",
       "Tyrosine          Soy protein isolate, PROTEIN TECHNOLOGIES INTE...\n",
       "Valine            Soy protein isolate, PROTEIN TECHNOLOGIES INTE...\n",
       "Name: food, dtype: object"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 只要稍微动一动脑子\n",
    "# 就可以发现各营养成分最为丰富的食物是什么\n",
    "\n",
    "by_nutrient = ndata.groupby(['nutgroup', 'nutrient'])\n",
    "\n",
    "get_maximum = lambda x : x.loc[x.value.idxmax()]\n",
    "\n",
    "get_minimum = lambda x : x.loc[x.value.idxmin()]\n",
    "\n",
    "max_foods = by_nutrient.apply(get_maximum)[['value', 'food']]\n",
    "\n",
    "# make the food a little smaller\n",
    "max_foods.food = max_foods.food.str[:50]\n",
    "\n",
    "# 由于得到 DataFrame 很大，所以不方便在书里面\n",
    "max_foods.loc['Amino Acids']['food']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
